package com.silence.tool.tool;

import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static lombok.AccessLevel.PRIVATE;

/**
 * @Author silence
 * @Email meng.wl@neusoft.com
 * @Date 2025-01-20 09:41
 * @Description pdf 分割工具类
 */
@Slf4j
@NoArgsConstructor(access = PRIVATE)
public class FileUtils {

    /**
     * 确保目录存在，不存在则创建
     *
     * @param directoryPath 目录路径
     * @return 创建的目录路径
     */
    public static String ensureDirectoryExists(String directoryPath) throws IOException {
        // 参数校验
        if (StringUtils.isBlank(directoryPath)) {
            throw new IllegalArgumentException("目录路径不能为空");
        }

        try {
            // 1. 规范化路径
            Path normalizedPath = Paths.get(directoryPath).normalize().toAbsolutePath();

            // 2. 创建目录（包括所有父目录）
            Files.createDirectories(normalizedPath);

            // 3. 验证目录可写
            if (!Files.isWritable(normalizedPath)) {
                throw new IOException("目录不可写: " + normalizedPath);
            }

            log.info("目录已创建/确认: {}", normalizedPath);
            return normalizedPath.toString();
        } catch (Exception e) {
            String message = String.format("创建目录失败: %s (%s)", directoryPath, e.getMessage());
            log.error(message, e);
            throw new IOException(message, e);
        }
    }

    /**
     * 确保文件父目录存在
     *
     * @param filePath 文件完整路径
     * @return 规范化后的文件路径
     */
    public static String ensureParentDirectoryExists(String filePath) throws IOException {
        // 参数校验
        if (StringUtils.isBlank(filePath)) {
            throw new IllegalArgumentException("文件路径不能为空");
        }

        try {
            // 1. 规范化路径
            Path normalizedPath = Paths.get(filePath).normalize().toAbsolutePath();

            // 2. 获取父目录
            Path parent = normalizedPath.getParent();
            if (parent != null) {
                Files.createDirectories(parent);
            }

            // 3. 返回规范化后的路径
            return normalizedPath.toString();
        } catch (Exception e) {
            String message = String.format("创建父目录失败: %s (%s)", filePath, e.getMessage());
            log.error(message, e);
            throw new IOException(message, e);
        }
    }

    /**
     * 检查文件是否存在且可读
     *
     * @param filePath 文件路径
     * @throws IOException 如果文件不存在或不可读，则抛出IOException
     */
    public static void validateFileReadable(String filePath) throws IOException {
        if (StringUtils.isBlank(filePath)) {
            throw new IllegalArgumentException("文件路径不能为空");
        }

        File file = new File(filePath);
        if (!file.exists()) {
            throw new IOException("文件不存在: " + filePath);
        }
        if (!file.isFile()) {
            throw new IOException("路径不是文件: " + filePath);
        }
        if (!file.canRead()) {
            throw new IOException("文件不可读: " + filePath);
        }
    }

}